From 9526b8037a76c973d1bac56ca6a00be92be9b131 Mon Sep 17 00:00:00 2001 From: "arun.sharma@intel.com[kaf24]" Date: Thu, 19 May 2005 08:20:21 +0000 Subject: [PATCH] bitkeeper revision 1.1459 (428c4c45ObcqPNCq2Ebb3M0y4qnxog) [PATCH] vmx-gdbserver-sstep.patch This patch enables single stepping a VMX domain using the gdbserver. Signed-Off-By: Leendert van Doorn Signed-off-by: Arun Sharma --- xen/arch/x86/domain.c | 6 ++++++ xen/arch/x86/vmx.c | 17 ++++++++++++++++- xen/arch/x86/vmx_platform.c | 2 +- xen/include/asm-x86/vmx.h | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 0b93ed87a2..458257a492 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -425,6 +425,12 @@ int arch_set_info_guest( /* Ensure real hardware interrupts are enabled. */ ed->arch.guest_context.user_regs.eflags |= EF_IE; + } else { + __vmwrite(GUEST_EFLAGS, ed->arch.guest_context.user_regs.eflags); + if (ed->arch.guest_context.user_regs.eflags & EF_TF) + __vm_set_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_DB); + else + __vm_clear_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_DB); } if ( test_bit(_VCPUF_initialised, &ed->vcpu_flags) ) diff --git a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c index 52c976f51f..78572a132b 100644 --- a/xen/arch/x86/vmx.c +++ b/xen/arch/x86/vmx.c @@ -166,7 +166,7 @@ static void vmx_do_no_device_fault() cr0 &= ~X86_CR0_TS; __vmwrite(GUEST_CR0, cr0); } - __vmwrite(EXCEPTION_BITMAP, MONITOR_DEFAULT_EXCEPTION_BITMAP); + __vm_clear_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_NM); } static void vmx_do_general_protection_fault(struct cpu_user_regs *regs) @@ -1108,6 +1108,21 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs regs) save_cpu_user_regs(®s); pdb_handle_exception(3, ®s, 1); restore_cpu_user_regs(®s); + break; + } +#else + case TRAP_debug: + { + void store_cpu_user_regs(struct cpu_user_regs *regs); + long do_sched_op(unsigned long op); + + + store_cpu_user_regs(®s); + __vm_clear_bit(GUEST_PENDING_DBG_EXCEPTIONS, PENDING_DEBUG_EXC_BS); + + set_bit(_VCPUF_ctrl_pause, ¤t->vcpu_flags); + do_sched_op(SCHEDOP_yield); + break; } #endif diff --git a/xen/arch/x86/vmx_platform.c b/xen/arch/x86/vmx_platform.c index 8de185c072..4ccafe7c2b 100644 --- a/xen/arch/x86/vmx_platform.c +++ b/xen/arch/x86/vmx_platform.c @@ -49,7 +49,7 @@ static long get_reg_value(int size, int index, int seg, struct cpu_user_regs *re return 0; } #elif defined (__i386__) -static void store_cpu_user_regs(struct cpu_user_regs *regs) +void store_cpu_user_regs(struct cpu_user_regs *regs) { __vmread(GUEST_SS_SELECTOR, ®s->ss); __vmread(GUEST_ESP, ®s->esp); diff --git a/xen/include/asm-x86/vmx.h b/xen/include/asm-x86/vmx.h index 3041a334f1..d9bed6621b 100644 --- a/xen/include/asm-x86/vmx.h +++ b/xen/include/asm-x86/vmx.h @@ -131,6 +131,11 @@ extern unsigned int cpu_rev; #define EXCEPTION_BITMAP_MC (1 << 18) /* Machine Check */ #define EXCEPTION_BITMAP_XF (1 << 19) /* SIMD Floating-Point Exception */ +/* Pending Debug exceptions */ + +#define PENDING_DEBUG_EXC_BP (1 << 12) /* break point */ +#define PENDING_DEBUG_EXC_BS (1 << 14) /* Single step */ + #ifdef XEN_DEBUGGER #define MONITOR_DEFAULT_EXCEPTION_BITMAP \ ( EXCEPTION_BITMAP_PG | \ @@ -231,6 +236,30 @@ static inline int __vmwrite (unsigned long field, unsigned long value) return 0; } +static inline int __vm_set_bit(unsigned long field, unsigned long mask) +{ + unsigned long tmp; + int err = 0; + + err |= __vmread(field, &tmp); + tmp |= mask; + err |= __vmwrite(field, tmp); + + return err; +} + +static inline int __vm_clear_bit(unsigned long field, unsigned long mask) +{ + unsigned long tmp; + int err = 0; + + err |= __vmread(field, &tmp); + tmp &= ~mask; + err |= __vmwrite(field, tmp); + + return err; +} + static inline void __vmxoff (void) { __asm__ __volatile__ ( VMXOFF_OPCODE @@ -263,8 +292,7 @@ static inline void vmx_stts() __vmread(CR0_READ_SHADOW, &cr0); if (!(cr0 & X86_CR0_TS)) - __vmwrite(EXCEPTION_BITMAP, MONITOR_DEFAULT_EXCEPTION_BITMAP | - EXCEPTION_BITMAP_NM); + __vm_set_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_NM); } #endif /* __ASM_X86_VMX_H__ */ -- 2.30.2